home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Languages / Mops 2.7 / Mops Manual / Demo folder / Matrix test < prev    next >
Text File  |  1993-02-27  |  5KB  |  215 lines

  1. \ Matrix timing test.  Nov 91.
  2.  
  3. need    floating point
  4.  
  5. \  Usage:   50 100  dimension   Fmatrix MM
  6.  
  7.     0    value    ROWDIM
  8.     0    value    COLDIM
  9.  
  10. : DIMENSION
  11.     -> colDim   -> rowDim
  12.     colDim  rowDim  *  ;
  13.  
  14.  
  15. :class    FMATRIX    super{  Farray  }
  16.  
  17.     var    #rows
  18.     var    #cols
  19.     var    rowLength
  20.     var    colLength
  21.  
  22. :m #ROWS:    get: #rows   ;m
  23. :m #COLS:    get: #cols   ;m
  24.  
  25. :m ^ELEM:  { row col \ temp -- addr }
  26.     row  get: #cols  *  col +   ^elem: super   ;m
  27.  
  28. :m AT:        ^elem: self  f@   ;m
  29.  
  30. :m TO:        ^elem: self  f!   ;m
  31.  
  32. :m ROW:  { row -- limit start stride }    \ Sets up for a DO over the row.
  33.     row  get: rowLength *   idxBase +        \ addr
  34.     get: rowLength  bounds                    \ ( limit addr )
  35.     12   ;m                                    \ stride
  36.  
  37. :m COL:  { col -- limit start stride }    \ Sets up for a DO over the column.
  38.     col 12 *  idxBase +                        \ addr
  39.     get: colLength  bounds                    \ ( limit addr )
  40.     get: rowLength   ;m                        \ stride
  41.  
  42. :m PUTROW:    \ ( 1st ... last  row -- )
  43.     row: self   drop  ( we know stride is 12 )
  44.     swap   12 -
  45.     do   i  f!   -12 +loop   ;m
  46.  
  47. :m PRINTROW:  { row -- }
  48.     row  row: self    drop
  49.     ?do   i f@ 10 e.r   12 +loop    ;m
  50.  
  51. :m PRINTCOL:  { col \ stride -- }
  52.     col  col: self   -> stride
  53.     ?do   i f@  10 e.r  cr   stride +loop    ;m
  54.  
  55. :m PRINT:
  56.     get: #rows  0
  57.     ?do   i printRow: self  cr   loop   ;m
  58.  
  59. :m CLASSINIT:
  60.     rowDim  put: #rows   colDim  put: #cols
  61.     get: #cols 12 *  put: rowLength
  62.     get: #rows  get: rowLength *   put: colLength
  63.     classinit: super   ;m
  64.  
  65. ;class
  66.  
  67.  
  68. 5 3 dimension  Fmatrix FF
  69.  
  70. objPtr    A    class_is  Fmatrix
  71. objPtr    B    class_is  Fmatrix
  72. objPtr    C    class_is  Fmatrix
  73.  
  74. : DIMSCHK  { l m n -- }
  75.     #rows: B      m    <>
  76.     l  #rows: C        <>
  77.     n  #cols: C        <>
  78.     or  or  abort" Wrong operand dimensions for matrix multiply"   ;
  79.  
  80.  
  81. : MXMPY  { m1 m2 m3 \ l m n  Aaddr Alimit Baddr stride %sum -- }
  82.     m1 -> A   m2 -> B   m3 -> C
  83.     #rows: A  -> l   #cols: A  -> m   #cols: B  -> n
  84.     l m n  dimsChk
  85.     l 0  DO
  86.         i row: A  drop   -> Aaddr  -> Alimit
  87.         n  0  DO
  88.             0.0 -> %sum
  89.             i col: B  -> stride  -> Baddr  drop
  90.             Alimit  Aaddr
  91.             DO     i  f@  Baddr f@   f*  ++> %sum
  92.                 stride ++> Baddr
  93.             12 +LOOP
  94.             %sum   j i to: C
  95.         LOOP
  96.     LOOP   ;
  97.  
  98.  
  99. : DUMMY  { m1 m2 m3 \ l m n  Aaddr Alimit Baddr stride %sum -- }
  100.     m1 -> A   m2 -> B   m3 -> C
  101.     #rows: A  -> l   #cols: A  -> m   #cols: B  -> n
  102.     l m n  dimsChk
  103.     l 0  DO
  104.         i row: A  drop   -> Aaddr  -> Alimit
  105.         n  0  DO
  106.             0.0 -> %sum
  107.             i col: B  -> stride  -> Baddr  drop
  108.             Alimit  Aaddr
  109.             DO
  110.         \        i f@   Baddr f@   f2drop
  111.                     \ Note: omit this line entirely for UseFPU? True test,
  112.                     \ otherwise overhead figure is artificially high.
  113.                 stride ++> Baddr
  114.             12 +LOOP
  115.             %sum   j i to: C
  116.         LOOP
  117.     LOOP  ;
  118.  
  119.  
  120. : SLOWMPY  { m1 m2 m3 \ l m n %sum -- }
  121.     m1 -> A   m2 -> B   m3 -> C
  122.     #rows: A  -> l   #cols: A  -> m   #cols: B  -> n
  123.     l m n  dimsChk
  124.     l 0  DO
  125.         n  0  do
  126.             0.0 -> %sum
  127.             m 0 DO
  128.                 k i  at: A   i j  at: B   f*  ++> %sum
  129.             LOOP
  130.             %sum   j i to: C
  131.         LOOP
  132.     LOOP  ;
  133.  
  134.  
  135. : SLOWDUMMY  { m1 m2 m3 \ l m n %sum -- }
  136.     m1 -> A   m2 -> B   m3 -> C
  137.     #rows: A  -> l   #cols: A  -> m   #cols: B  -> n
  138.     l m n  dimsChk
  139.     l 0  DO
  140.         n  0  DO
  141.             0.0 -> %sum
  142.             m 0 DO
  143.                 k i  at: A   i j  at: B   f2drop
  144.             LOOP
  145.             %sum   j i to: C
  146.         LOOP
  147.     LOOP  ;
  148.  
  149.  
  150. 3 5 dimension  fmatrix  matA
  151. 5 3 dimension  fmatrix  matB
  152. 3 3 dimension  fmatrix  matC
  153.  
  154. -2.0 -7.0 -4.0 8.0 1.0      0  putRow: matA
  155. -3.0 0.0 -1.0 0.0 -9.0        1  putRow: matA
  156. 0.0 -1.0 -8.0 -9.0 -3.0        2  putRow: matA
  157.  
  158. -1.0 3.0 -2.0                0  putRow: matB
  159. 4.0 -1.0 1.0                1  putRow: matB
  160. 9.0 -4.0 -8.0                2  putRow: matB
  161. -5.0 0.0 -3.0                3  putRow: matB
  162. 6.0 3.0 -6.0                4  putRow: matB
  163.  
  164. 0.0    fvalue    TOTAL
  165. 0.0    fvalue    OVERHEAD
  166. 0.0    fvalue    CALCS
  167. 0.0    fvalue    SLOWTOTAL
  168. 0.0    fvalue    SLOWOVERHEAD
  169. 0.0    fvalue    SLOWCALCS
  170.  
  171.  
  172. : MATINIT    \ ( mat -- )
  173.     -> A
  174.     #rows: A  0
  175.     do
  176.         #cols: A  0
  177.         do
  178.             i j +  >float  j i to: A
  179.         loop
  180.     loop   ;
  181.  
  182. : TICKS    global Ticks  @  ;
  183.  
  184.  
  185. : .RESULTS    \ ( flt -- )
  186.     fdup  6  f.r  6 spaces
  187.     20.0  f*  16.0 f/   ." scaled: "  6  f.r   cr  ;
  188.  
  189.  
  190. : TIMER  { mx1 mx2 mx3 -- }
  191.     mx1 matinit   mx2  matinit
  192.     ticks
  193.     10 0 do   mx1  mx2  mx3  mxmpy   loop
  194.     ticks  swap -  >float  600.0 f/  -> total
  195.     ticks
  196.     10 0 do   mx1  mx2  mx3  dummy   loop
  197.     ticks  swap -   >float  600.0 f/  -> overhead
  198.     total  overhead  f-  -> calcs
  199.     ticks
  200.     10 0 do   mx1  mx2  mx3  slowmpy   loop
  201.     ticks  swap -  >float  600.0 f/  -> slowtotal
  202.     ticks
  203.     10 0 do   mx1  mx2  mx3  slowDummy   loop
  204.     ticks  swap -  >float  600.0 f/  -> slowoverhead
  205.     slowTotal  slowOverhead  f-  -> slowCalcs
  206.     ." Total         "  total  .results
  207.     ." Calcs       "  calcs  .results
  208.     ." Overhead"  overhead  .results
  209.     ." Slow total"  slowTotal  .results
  210.     ." Slow calcs"  slowCalcs  .results
  211.     ." Slow overhead"  slowOverhead  .results  ;
  212.  
  213. 50 50 dimension  fmatrix  SOURCE
  214. 50 50 dimension  fmatrix  RESULT
  215.